import pandas as pd
import openpyxl
import os
import time
from openpyxl.utils import get_column_letter

# 设置文件路径
source_file_path = "D:/VaultView/SOLIDWORKS数据管理/5-Giant-laser工作体系/非质量管理体系文件/业务部/瀚越已发货包装数据总表.xlsx"

class TestExcelSearchTool:
    def __init__(self):
        # 记录测试结果
        self.test_results = {
            "merge_cell_check": False,
            "search_functionality": False,
            "result_comparison": False
        }
        
        # 测试搜索文本
        self.test_search_texts = [
            "A9BB0032098(D4569680.R1)",  # 包含特殊字符的测试文本
            # 可以根据需要添加更多测试文本
        ]
        
    def run_complete_test(self):
        """运行完整的测试流程"""
        print("===== Excel搜索工具测试脚本 =====")
        print(f"测试时间: {time.strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"源文件路径: {source_file_path}")
        print("=" * 50)
        
        # 1. 检查文件是否存在
        if not self._check_file_exists():
            return
        
        # 2. 检查合并单元格情况
        if not self._check_merge_cells():
            return
        
        # 3. 测试搜索功能
        self._test_search_functionality()
        
        # 4. 显示测试总结
        self._display_test_summary()
        
    def _check_file_exists(self):
        """检查源文件是否存在"""
        if not os.path.exists(source_file_path):
            print("[错误] 源文件不存在!")
            return False
        
        print("[成功] 源文件存在")
        return True
        
    def _check_merge_cells(self):
        """检查Excel文件中的合并单元格情况"""
        try:
            # 使用openpyxl直接读取Excel文件以检查合并单元格
            wb = openpyxl.load_workbook(source_file_path, data_only=True)
            
            # 检查工作表是否存在
            if "已发货" not in wb.sheetnames:
                print("[错误] '已发货'工作表不存在!")
                wb.close()
                return False
            
            sheet = wb["已发货"]
            
            print("\n===== 合并单元格检查 =====")
            print(f"工作表: '已发货'")
            print(f"总行数: {sheet.max_row}")
            print(f"总列数: {sheet.max_column}")
            
            # 检查是否有合并单元格
            merge_ranges = sheet.merged_cells.ranges
            print(f"发现合并单元格数量: {len(merge_ranges)}")
            
            # 统计E列的合并单元格（VBA代码中特别处理的列）
            e_column_merges = []
            for merge in merge_ranges:
                if merge.min_col == 5 and merge.max_col == 5:  # E列是第5列
                    e_column_merges.append(merge)
            
            print(f"E列合并单元格数量: {len(e_column_merges)}")
            
            # 显示前5个E列合并单元格的范围
            if e_column_merges:
                print("前5个E列合并单元格范围:")
                for i, merge in enumerate(e_column_merges[:5]):
                    print(f"  {i+1}. 行范围: {merge.min_row}-{merge.max_row}")
            
            # 关闭工作簿
            wb.close()
            
            # 更新测试结果
            self.test_results["merge_cell_check"] = True
            print("[成功] 合并单元格检查完成")
            return True
            
        except Exception as e:
            print(f"[错误] 合并单元格检查过程中发生错误: {str(e)}")
            return False
            
    def _test_search_functionality(self):
        """测试搜索功能，特别是对合并单元格的处理"""
        try:
            print("\n===== 搜索功能测试 =====")
            
            # 对每个测试文本执行搜索
            for search_text in self.test_search_texts:
                print(f"\n测试搜索文本: '{search_text}'")
                
                # 使用openpyxl读取文件
                wb = openpyxl.load_workbook(source_file_path, data_only=True)
                sheet = wb["已发货"]
                
                # 获取表头
                headers = []
                for col in range(1, sheet.max_column + 1):
                    headers.append(sheet.cell(row=1, column=col).value)
                
                # 记录已处理的行
                processed_rows = set()
                results = []
                
                # 遍历所有行（跳过表头）
                for row in range(2, sheet.max_row + 1):
                    # 跳过已处理的行
                    if row in processed_rows:
                        continue
                    
                    # 获取B列单元格的值
                    cell_b = sheet.cell(row=row, column=2)  # B列是第2列
                    cell_value = cell_b.value
                    
                    # 检查是否包含搜索文本
                    if cell_value and isinstance(cell_value, str) and search_text.lower() in cell_value.lower():
                        # 检查E列是否为合并单元格
                        cell_e = sheet.cell(row=row, column=5)  # E列是第5列
                        
                        # 查找该单元格所属的合并区域
                        merge_range = None
                        for merge in sheet.merged_cells.ranges:
                            if cell_e.coordinate in merge:
                                merge_range = merge
                                break
                        
                        # 确定要复制的行范围
                        if merge_range:
                            start_row = merge_range.min_row
                            end_row = merge_range.max_row
                            print(f"  找到匹配记录 (行{row})，E列包含合并单元格，范围: 行{start_row}-{end_row}")
                        else:
                            start_row = row
                            end_row = row
                            print(f"  找到匹配记录 (行{row})，E列无合并单元格")
                        
                        # 添加到结果
                        for r in range(start_row, end_row + 1):
                            if r not in processed_rows:
                                row_data = []
                                for col in range(1, sheet.max_column + 1):
                                    row_data.append(sheet.cell(row=r, column=col).value)
                                results.append(row_data)
                                processed_rows.add(r)
                
                # 关闭工作簿
                wb.close()
                
                print(f"  搜索完成，共找到 {len(results)} 条记录")
                
                # 如果有结果，保存到测试文件
                if results:
                    # 创建包含结果的DataFrame
                    result_df = pd.DataFrame(results, columns=headers)
                    
                    # 添加搜索文本标识
                    result_df.insert(0, "搜索文本", search_text)
                    
                    # 保存结果
                    test_output_path = f"test_result_{search_text.replace('(', '_').replace(')', '')}.xlsx"
                    result_df.to_excel(test_output_path, index=False)
                    print(f"  测试结果已保存至: {os.path.abspath(test_output_path)}")
                
            # 更新测试结果
            self.test_results["search_functionality"] = True
            print("[成功] 搜索功能测试完成")
            
        except Exception as e:
            print(f"[错误] 搜索功能测试过程中发生错误: {str(e)}")
            
    def _display_test_summary(self):
        """显示测试结果总结"""
        print("\n===== 测试结果总结 =====")
        
        for test_name, passed in self.test_results.items():
            status = "通过" if passed else "失败"
            print(f"{test_name}: {status}")
        
        print("\n===== 测试建议 =====")
        print("1. 请检查生成的测试结果文件，确认是否包含了完整的搜索结果")
        print("2. 与VBA版工具生成的结果进行对比，确保内容完全一致")
        print("3. 如果测试通过，您可以使用build_exe.bat重新打包工具")
        print("4. 如遇到问题，请查看excel_search_tool.log文件获取详细错误信息")

if __name__ == "__main__":
    # 创建测试工具实例
    test_tool = TestExcelSearchTool()
    
    # 运行完整测试
    test_tool.run_complete_test()
    
    # 等待用户输入，防止控制台关闭
    input("\n按Enter键退出...")